Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[JAVA] Niedokończony wąż


Rekomendowane odpowiedzi

Opublikowano

Parę miesięcy temu robiłem mojego pierwszego snake'a w javie, ale ostatecznie rzuciłem to dla wyższych celów. Został mi jeszcze kod, który być może dla kogoś będzie inspiracją lub pomocą (przynajmniej jakieś fragmenty kodu). Kod piękny nie jest, bo już dawno to robiłem, ale może się przydać.

Snake.java

package Sanke;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;

public class Snake extends Applet implements KeyListener {
	int roz1 = 25*30;
	int roz2 = 20*30;
	int strona = 0;
	static Applet snake;
	Zadanie zadanie = new Zadanie();
	Timer timer = new Timer();
	Image bufor;
	Graphics bg;
	Image glowa;
	Image glowa2;
	Image glowa3;
	Image glowa4;
	Image podloze;
	Image sciana;
	Image jablko;
	Image ogon;
         public void init(){
        	 snake = this;
        	 addKeyListener(this);
        	 snake.setSize(roz1, roz2);
        	 snake.setBackground(Color.WHITE);
        	 timer.scheduleAtFixedRate(zadanie, 10, 100);
        	 bufor = createImage(roz1, roz2);
             bg = bufor.getGraphics();
        	 zadanie.RysujPlansze();
        	 glowa = getImage(getDocumentBase(), "glowa.jpg");
        	 glowa2 = getImage(getDocumentBase(), "glowa2.jpg");
        	 glowa3 = getImage(getDocumentBase(), "glowa3.jpg");
        	 glowa4 = getImage(getDocumentBase(), "glowa4.jpg");
        	 podloze = getImage(getDocumentBase(), "podloze.jpg");
        	 sciana = getImage(getDocumentBase(), "sciana.jpg");
        	 jablko = getImage(getDocumentBase(), "jablko.png");
        	 ogon = getImage(getDocumentBase(), "ogon.png");
         }
         public void update(Graphics g){
     		bg.clearRect(0, 0, roz1, roz2);
     		paint(bg);
     		g.drawImage(bufor, 0, 0, snake);
     	}
         public void paint(Graphics g){
        	 rysujPlansze(g);
         }
         public void rysujPlansze(Graphics g){
        	 for(int i=0; i<zadanie.Mapa.length;i++){
     	    	for(int j=0; j<zadanie.Mapa[0].length;j++){
     	    	     switch(zadanie.Mapa[i][j]){
     	    	     case 0:
     	    	    	 g.drawImage(podloze, j*30, i*30, this);
     	    	    	 break;
     	    	     case 1:
     	    	    	 g.drawImage(sciana, j*30, i*30, this);
     	    	    	 break;
     	    	     case 3:
     	    	    	g.drawImage(podloze, j*30, i*30, this);
     	    	    	g.drawImage(jablko, j*30, i*30, this);
     	    	    	 break;
     	    	     case 4:
     	    	    	g.drawImage(ogon, j*30, i*30, this);
     	    	    	 break;
     	    	     case 2:
     	    	    	 if(strona == 1){
     	    	    	 g.drawImage(glowa4, j*30, i*30, this);
     	    	    	 }
     	    	    	else if(strona == 3){
        	    	    	 g.drawImage(glowa2, j*30, i*30, this);
        	    	    	 }
     	    	    	else if(strona == 4){
        	    	    	 g.drawImage(glowa3, j*30, i*30, this);
        	    	    	 }
     	    	    	if(strona == 2 || strona == 0){
       	    	    	 g.drawImage(glowa, j*30, i*30, this);
       	    	    	 }
     	    	    	 break;
     	    	     }
     	    	}   		
     		}
     	}
         
		@Override
		public void keyTyped(KeyEvent e) {
			
			
		}
		@Override
		public void keyPressed(KeyEvent e) {
			switch(e.getKeyCode()){
			case 37:
				zadanie.x = 1;
				strona = 1;
				break;
			case 38:
				zadanie.x = 2;
				strona = 2;
				break;
			case 39:
				zadanie.x = 3;
				strona = 3;
				break;
			case 40:
				zadanie.x = 4;
				strona = 4;
				break;
			}
			
		}
		@Override
		public void keyReleased(KeyEvent e) {
			
			
		}
}

Zadanie.java

package Sanke;

import java.util.Arrays;
import java.util.Random;
import java.util.TimerTask;

public class Zadanie extends TimerTask {
	int a;
	int b;
	Random losuj = new Random();
	int poz1 = 12;
	int poz2 = 10;
	int pozj1 = 3;
	int pozj2 = 6;
	int ogony = 0;
	int Mapa[][] = new int[20][25];
	static int x;
  public void run(){
		 a = 1+losuj.nextInt(18);
	   	     b = 1+losuj.nextInt(23);
	   	     if(ogony == 0){
         switch(x){
         case 0:
        	 if(Mapa[poz1-1][poz2]==0){
      			  Mapa[poz1-1][poz2]=2;
      			  Mapa[poz1][poz2]=0;
      			  poz1--;
        	 }
        	 break;
         case 1:
        	 if(Mapa[poz1][poz2-1]==0){
   			  Mapa[poz1][poz2-1]=2;
   			  Mapa[poz1][poz2]=0;
   			  poz2--;
   		  }
        	 if(Mapa[poz1][poz2-1]==1){
        		 Snake.snake.repaint();
        		 try {
 					Thread.sleep(500);
 				} catch (InterruptedException e) {
 					
 					e.printStackTrace();
 				}
        	    restart();

        	 }
        	 if(Mapa[poz1][poz2-1]==3){
        		 ogony = 1;
        		 Mapa[poz1][poz2-1]=2;
        		 Mapa[poz1][poz2]=0;
        		 Mapa[pozj1][pozj2]=0;
       	         Mapa[a][b] = 3;
       	         if(Mapa[a][b]==1)
       	         {
       	        	 do{
       	        		a = 1+losuj.nextInt(18);
       		   	     b = 1+losuj.nextInt(23);
          	         Mapa[a][b] = 3;
       	        	 }while(Mapa[a][b] == 1);
       	         }
       	         if(Mapa[a][b] == 0){
       	        	 Mapa[pozj1][pozj2]=0;
       	        	 if(pozj1<a && pozj2<{
       	        		 pozj1 +=a;
       	        		 pozj2 +=b;
       	        	 }
       	        	 else if(pozj1>a && pozj2>{
       	        		pozj1 -=a;
      	        		 pozj2 -=b;
       	        	 }
       	        	else if(pozj1<a && pozj2>{
       	        		pozj1 +=a;
      	        		 pozj2 -=b;
       	        	 }
       	        	else if(pozj1>a && pozj2<{
       	        		pozj1 -=a;
      	        		 pozj2 +=b;
       	        	 }
       	         }
        		 poz2--;
        	 }
        	 break;
         case 2:
        	 if(Mapa[poz1-1][poz2]==0){
   			  Mapa[poz1-1][poz2]=2;
   			  Mapa[poz1][poz2]=0;
   			  poz1--;
   		  }
        	 if(Mapa[poz1-1][poz2]==1){
        		 Snake.snake.repaint();
        		 try {
 					Thread.sleep(500);
 				} catch (InterruptedException e) {
 					
 					e.printStackTrace();
 				}
        	    restart();

        	 }
        	 if(Mapa[poz1-1][poz2]==3){
        		 ogony = 1;
        		 Mapa[poz1-1][poz2]=2;
        		 Mapa[poz1][poz2]=0;
       	         Mapa[a][b] = 3;
       	      if(Mapa[a][b]==1)
    	         {
       	    	do{
       	    		a = 1+losuj.nextInt(18);
       	   	     b = 1+losuj.nextInt(23);
          	         Mapa[a][b] = 3;
       	        	 }while(Mapa[a][b] == 1);
    	         }
       	   if(Mapa[a][b] == 0){
 	        	 Mapa[pozj1][pozj2]=0;
 	        	 if(pozj1<a && pozj2<{
 	        		 pozj1 +=a;
 	        		 pozj2 +=b;
 	        	 }
 	        	 else if(pozj1>a && pozj2>{
 	        		pozj1 -=a;
	        		 pozj2 -=b;
 	        	 }
 	        	else if(pozj1<a && pozj2>{
 	        		pozj1 +=a;
	        		 pozj2 -=b;
 	        	 }
 	        	else if(pozj1>a && pozj2<{
 	        		pozj1 -=a;
	        		 pozj2 +=b;
 	        	 }
 	         }
        		 poz1--;
        	 }
        	 break;
         case 3:
        	 if(Mapa[poz1][poz2+1]==0){
   			  Mapa[poz1][poz2+1]=2;
   			  Mapa[poz1][poz2]=0;
   			  poz2++;
   		  }
        	 if(Mapa[poz1][poz2+1]==1){
        		 Snake.snake.repaint();
        		 try {
 					Thread.sleep(500);
 				} catch (InterruptedException e) {
 					
 					e.printStackTrace();
 				}
        	    restart();

        	 }
        	 if(Mapa[poz1][poz2+1]==3){
        		 ogony = 1;
        		 Mapa[poz1][poz2+1]=2;
        		 Mapa[poz1][poz2]=0;
       	         Mapa[a][b] = 3;
       	      if(Mapa[a][b]==1)
    	         {
       	    	do{
       	    		a = 1+losuj.nextInt(18);
       	   	     b = 1+losuj.nextInt(23);
          	         Mapa[a][b] = 3;
       	        	 }while(Mapa[a][b] == 1);
    	         }
       	   if(Mapa[a][b] == 0){
 	        	 Mapa[pozj1][pozj2]=0;
 	        	 if(pozj1<a && pozj2<{
 	        		 pozj1 +=a;
 	        		 pozj2 +=b;
 	        	 }
 	        	 else if(pozj1>a && pozj2>{
 	        		pozj1 -=a;
	        		 pozj2 -=b;
 	        	 }
 	        	else if(pozj1<a && pozj2>{
 	        		pozj1 +=a;
	        		 pozj2 -=b;
 	        	 }
 	        	else if(pozj1>a && pozj2<{
 	        		pozj1 -=a;
	        		 pozj2 +=b;
 	        	 }
 	         }
        		 poz2++;
        	 }
	         break;
         case 4:
        	 if(Mapa[poz1+1][poz2]==0){
   			  Mapa[poz1+1][poz2]=2;
   			  Mapa[poz1][poz2]=0;
   			  poz1++;
   		  }
        	 if(Mapa[poz1-1][poz2]==1){
        		 Snake.snake.repaint();
        		 try {
 					Thread.sleep(500);
 				} catch (InterruptedException e) {
 					
 					e.printStackTrace();
 				}
        	    restart();

        	 }
        	 if(Mapa[poz1+1][poz2]==3){
        		 ogony = 1;
        		 Mapa[poz1+1][poz2]=2;
        		 Mapa[poz1][poz2]=0;
       	         Mapa[a][b] = 3;
       	      if(Mapa[a][b]==1)
    	         {
       	    	do{
       	    		a = 1+losuj.nextInt(18);
       	   	     b = 1+losuj.nextInt(23);
          	         Mapa[a][b] = 3;
       	        	 }while(Mapa[a][b] == 1);
    	         }
       	   if(Mapa[a][b] == 0){
 	        	 Mapa[pozj1][pozj2]=0;
 	        	 if(pozj1<a && pozj2<{
 	        		 pozj1 +=a;
 	        		 pozj2 +=b;
 	        	 }
 	        	 else if(pozj1>a && pozj2>{
 	        		pozj1 -=a;
	        		 pozj2 -=b;
 	        	 }
 	        	else if(pozj1<a && pozj2>{
 	        		pozj1 +=a;
	        		 pozj2 -=b;
 	        	 }
 	        	else if(pozj1>a && pozj2<{
 	        		pozj1 -=a;
	        		 pozj2 +=b;
 	        	 }
 	         }
        		 poz1++;
        	 }
	         break;
         }
	   	     }
	   
	  Snake.snake.repaint();
  }
  public void RysujPlansze(){
	  int Mapa2[][] = {
			  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	  };
	  for(int i=0; i<Mapa.length;i++){
	    	for(int j=0; j<Mapa[0].length;j++){
	    		Mapa[i][j] = Mapa2[i][j];
  }
	  }
  }
  public void restart(){
	  Mapa[poz1][poz2]=0;
	  poz1 = 12;
	  poz2 = 22;
	  Mapa[poz1][poz2]=2;
  }
}

P.S. Nie wiem czy nie powinienem wstawić tego do działu javy, ale najwyżej ktoś przeniesie.

PS2: Dodaje obrazki, ale są one robione przeze mnie w paincie ;F

Image.rar

Opublikowano

Bez zastrzeżeń, aczkolwiek nazwy zmiennej powinno się pisać z małej literki (Mapa -> mapa).
Fajny, czytelny kod, pewnie dało by się go jeszcze zrefaktoryzować, ale jest git :)

Dodaj jeszcze obrazki :F

Opublikowano

Trochę tego kawałka nie rozumiem:

 

         public void update(Graphics g){
            bg.clearRect(0, 0, roz1, roz2);
            paint(bg);
            g.drawImage(bufor, 0, 0, snake);
        }
         public void paint(Graphics g){
             rysujPlansze(g);
         }

 

Nie można byłoby po prostu:

 

         public void update(Graphics g){
            bg.clearRect(0, 0, roz1, roz2);
             rysujPlansze(g);
            g.drawImage(bufor, 0, 0, snake);
        }

?

Opublikowano

@M4aniak

Jakbym zrobił tak jak Ty napisałeś to by mi mapka migała(Tak przypuszczam). Zresztą dużej różnicy nie ma, a tak jest wygodnie i przejrzyście.

Opublikowano

@M4aniak

Jakbym zrobił tak jak Ty napisałeś to by mi mapka migała(Tak przypuszczam). Zresztą dużej różnicy nie ma, a tak jest wygodnie i przejrzyście.

 

Do tego służy podwójne buforowanie, ilość funkcji nie ma znaczenia ;)

Tak na przyszłość ;)

BufferStrategy bs = getBufferStrategy();
Graphics g = bs.getDrawGraphics();

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...